NOTE: THIS VERSION IS CURRENTLY UNSTABLE AND ONLY FOR DEVELOPMENT PURPOSE.

Note: if you use scigenex in published research, please cite:

https://github.com/dputhier/scigenex

Installation

Installing DBFMCL

devtools::install_github("dputhier/scigenex")
library(scigenex)

Installing MCL

The scigenex method implements the DBFMCL algorithm. Although an implementation of MCL exists for R (see the MCL library) we very strongly encourage you to install the original MCL tool from S.M. van Dongen. Indeed, the R version is slower, not reproducible and produced very different results from the original version.

You may install MCL using conda. Importantly, the mcl command should be in your PATH and reachable from within R.

conda install -c bioconda mcl

Alternatively install MCL from sources.

# Download the latest version of mcl 
wget http://micans.org/mcl/src/mcl-latest.tar.gz
# Uncompress and install mcl
tar xvfz mcl-latest.tar.gz
cd mcl-xx-xxx
./configure
make
sudo make install
# You should get mcl in your path
mcl -h

Loading and normalizing the PBMC dataset

For this tutorial, we will use the classical Seurat dataset related to Peripheral Blood Mononuclear Cells (PBMC) that is freely available from 10X Genomics. This dataset contains 2,700 single cells sequenced on the Illumina NextSeq 500.

library(Seurat)
library(ggplot2)

# Load the PBMC dataset
# please adapt the path
setwd("~/Downloads/")
pbmc_data <- Read10X(data.dir = "filtered_gene_bc_matrices/hg19/")
pbmc_raw <- CreateSeuratObject(counts = pbmc_data, project = "pbmc3k",
                               min.cells = 3, 
                               min.features = 200)
## Warning: Feature names cannot have underscores ('_'), replacing with dashes
## ('-')

We compute the classical QC metrics and define a set of cells for further analysis.

# Filter cells based on QC metrics
pbmc_raw[["percent.mt"]] <- PercentageFeatureSet(pbmc_raw, pattern = "^MT-")
pbmc_raw <- subset(pbmc_raw, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

Then the dataset is normalized as in the classical approach described in Seurat package.

# Perform simple log-transformation and scaling
pbmc_norm <- NormalizeData(pbmc_raw, 
                          normalization.method = "LogNormalize",
                          scale.factor = 10000)

Selecting Features and getting gene cluster

One of the pivotal object of the scigenex package is the ClusterSet object. This object can be created from a count matrix and list of user defined sets of informative gene (TODO: implement ClusterSetFromGeneSets).

TODO: provide an example of user defined gene/cluster selection (e.g. variance + K-means).

The scigenex package also proposes another solution that uses the DBFMCL() algorithm. This algorithm which was previously develop for microarray data analysis has been adapted for scRNA-seq analysis. The objective of the algorithm is dual: (i) select informative genes, (ii) define a set of gene cluster with the same expression profile.

Note about DBFMCL. One important issue in high throuput gene expression analysis is the selection of informative features (i.e genes) and the identification of gene clusters. These datasets are considered to be highly noisy and a typical way of selecting features is to filter them based on variance. Regarding gene partitioning a popular solution is to use k-means. In the context of the microarray data analysis we had shown that another way of selecting informative genes is to try to capture groups of highly correlated features (clusters). These genes can be viewed as elements displaying weak distances to their nearest neighbors that represent densely populated regions (i.e. strong profile similarities). This solution was previously implemented in the DBFMCL (Density-Based Filtering and Markov Clustering) algorithm. To isolate these regions DBF-MCL computes, for each gene/element, the distance with its kth nearest neighbor (DKNN). In order to define a critical DKNN value (that will depend on the dataset), DBF-MCL computes simulated DKNN values by using an empirical randomization procedure. Given a dataset containing n genes and p samples, a simulated DKNN value is obtained by sampling n distance values from the gene-gene distance matrix D and by extracting the kth-smallest value. This procedure is repeated n times to obtain a set of simulated DKNN values S. Computed distributions of simulated DKNN are used to compute a FDR value for each observed DKNN value. The critical value of DKNN is the one for which a user-defined FDR value (typically 10%) is observed. Genes with DKNN value below this threshold are selected and used to construct a graph. In this graph, edges are constructed between two genes (nodes) if one of them belongs to the k-nearest neighbors of the other. Edges are weighted based on the respective coefficient of correlation (i.e., similarity) and the graph obtained is partitioned using the Markov CLustering algorithm (MCL). While this algorithm was previously developed for microarray we have adapted it to work with discrete data, especially scRNA-seq data.

From this Seurat object we can directly perform feature selection and gene cluster inference with DBFMCL. Here DBFMCL() is used with default arguments. Note that the mcl_cmd_line is set to true to indicate that we won’t use the R implementation of MCL (see @ref(installation))

library(scigenex)
pbmc_df <- as.data.frame(pbmc_norm@assays$RNA@data)
dbf <- DBFMCL(pbmc_df, 
              mcl_cmd_line=TRUE,
              distance_method="pearson",
              av_dot_prod_min=2,
              k = 50,
              inflation = 8)
## The following parameters will be used : 
##  Working directory:  /Users/puthier/Documents/git/project_dev/scigenex_html_doc/docs 
##  Ouput directory:  /Users/puthier/Documents/git/project_dev/scigenex_html_doc/docs 
##  Name:  16aDYus0G1 
##  Distance method:  pearson 
##  Minimum average dot product for clusters:  2 
##  Minimum cluster size:  10 
##  Number of neighbors:  50 
##  Number of randomizations:  3 
##  FDR:  10 % 
##  Inflation: 8 
##  Visualize standard outputs from both mcl and cluster commands:  FALSE 
##  Memory used :  1024 
## 
## |--  DBF completed. Starting MCL step. 
## |--  Running MCL through the command line for best performance. 
## Running mcl (graph partitioning)... |--  Done 
## |--  creating file : /Users/puthier/Documents/git/project_dev/scigenex_html_doc/docs/16aDYus0G1.mcl_out.txt 
## |--  Reading MCL output: /Users/puthier/Documents/git/project_dev/scigenex_html_doc/docs/16aDYus0G1.mcl_out.txt 
## |--  9  clusters conserved after MCL partitioning. 
## |--  2086  clusters filtered out from MCL partitioning (size and mean dot product).

The clusterSet object

The result of the DBFMCL function is an S4 object (ClusterSet).

is(dbf)
## [1] "ClusterSet"

This object contains the following slots:

slotNames(dbf)
##  [1] "name"                "data"                "cluster"            
##  [4] "size"                "center"              "parameters"         
##  [7] "algorithm"           "cell_types"          "cell_colors"        
## [10] "cell_order"          "cluster_annotations"

It has the following methods:

showMethods(class="ClusterSet", where = "package:scigenex")
## Function: dim (package base)
## x="ClusterSet"
## 
## Function: load_seurat (package scigenex)
## object="ClusterSet"
## 
## Function: plot_clust (package scigenex)
## object="ClusterSet"
## 
## Function: write_clust (package scigenex)
## object="ClusterSet"

Search of cell populations using DBFMCL selected genes

The gene filtered using DBFMCL can now be used to subset a Seurat Object and search for cell populations.

pbmc_dbf <- pbmc_norm
VariableFeatures(pbmc_dbf) <- rownames(dbf@data)
pbmc_dbf <- ScaleData(pbmc_dbf)
pbmc_dbf <- RunPCA(pbmc_dbf, features = rownames(pbmc_dbf))
## Warning in PrepDR(object = object, features = features, verbose = verbose):
## The following 12657 features requested have not been scaled (running reduction
## without them): AL627309.1, AP006222.2, RP11-206L10.2, RP11-206L10.9, LINC00115,
## NOC2L, KLHL17, PLEKHN1, RP11-54O7.17, RP11-54O7.11, AGRN, C1orf159, TNFRSF18,
## TNFRSF4, SDF4, B3GALT6, FAM132A, UBE2J2, ACAP3, PUSL1, CPSF3L, GLTPD1, DVL1,
## MXRA8, AURKAIP1, CCNL2, RP4-758J18.2, MRPL20, ATAD3C, ATAD3B, ATAD3A, SSU72,
## AL645728.1, C1orf233, RP11-345P4.9, MIB2, MMP23B, CDK11B, SLC35E2B, CDK11A,
## SLC35E2, GNB1, RP1-140A9.1, TMEM52, PRKCZ, RP5-892K4.1, C1orf86, AL590822.2,
## SKI, RER1, PEX10, PLCH2, PANK4, RP3-395M20.12, TNFRSF14, RP3-395M20.9, FAM213B,
## MMEL1, TTC34, MEGF6, TPRG1L, WRAP73, TP73-AS1, SMIM1, LRRC47, CEP104, DFFB,
## C1orf174, NPHP4, KCNAB2, RNF207, ICMT, GPR153, ACOT7, RP1-202O8.3, ESPN,
## TNFRSF25, PLEKHG5, NOL9, ZBTB48, KLHL21, PHF13, THAP3, DNAJC11, RP11-312B8.1,
## CAMTA1, VAMP3, PER3, UTS2, TNFRSF9, PARK7, SLC45A1, RERE, RP5-1115A15.1, ENO1,
## ENO1-AS1, CA6, SLC2A5, GPR157, H6PD, SPSB1, SLC25A33, TMEM201, PIK3CD, C1orf200,
## RP11-558F24.4, CLSTN1, CTNNBIP1, LZIC, NMNAT1, UBE4B, KIF1B, APITD1, DFFA,
## PEX14, CASZ1, TARDBP, RP4-635E18.8, SRM, EXOSC10, MTOR, UBIAD1, FBXO2, FBXO44,
## FBXO6, MAD2L2, DRAXIN, MTHFR, CLCN6, KIAA2013, PLOD1, MFN2, MIIP, TNFRSF8,
## VPS13D, DHRS3, PRDM2, TMEM51, RP3-467K16.4, CASP9, DNAJC16, AGMAT, DDI2,
## PLEKHM2, FBLIM1, RP11-169K16.9, SPEN, ZBTB17, ARHGEF19, RSG1, FBXO42, SZRD1,
## SPATA21, NECAP2, RP4-798A10.2, RP4-798A10.7, RP4-798A10.4, NBPF1, CROCCP2,
## CROCC, RP11-108M9.4, RP11-108M9.6, ATP13A2, PADI2, PADI4, RCC2, ALDH4A1, IFFO2,
## UBR4, RP1-43E13.2, EMC1, MRTO4, AKR7A2, PQLC2, CAPZB, MINOS1-NBL1, MINOS1, NBL1,
## TMCO4, OTUD3, UBXN10-AS1, UBXN10, CAMK2N1, MUL1, PINK1, PINK1-AS, DDOST, HP1BP3,
## RP5-930J4.4, EIF4G3, ECE1, RP3-329E20.2, NBPF3, ALPL, USP48, HSPG2, RP1-224A6.3,
## LINC00339, CDC42, ZBTB40, C1QA, C1QC, C1QB, EPHB2, KDM1A, LUZP1, RP5-1057J7.6,
## HNRNPR, ZNF436, C1orf213, TCEA3, E2F2, ID3, MDS2, TCEB3, RP5-886K2.3, PITHD1,
## LYPLA2, GALE, HMGCL, FUCA1, CNR2, PNRC2, SRSF10, IFNLR1, STPG1, NIPAL3, RCAN3,
## RP4-594I10.3, SRRM1, RUNX3, SYF2, C1orf63, RP3-465N24.6, TMEM50A, TMEM57,
## RP11-70P17.1, MAN1C1, RP1-187B23.1, SEPN1, RP1-317E23.3, MTFR1L, AL020996.1,
## PAQR7, STMN1, PAFAH2, PDIK1L, ZNF593, CNKSR1, CEP85, AIM1L, ZNF683, DHDDS,
## HMGN2, RPS6KA1, ARID1A, PIGV, ZDHHC18, GPN2, GPATCH3, NUDC, C1orf172, TRNP1,
## SLC9A1, WDTC1, TMEM222, SYTL1, MAP3K6, WASF2, RP1-159A19.4, AHDC1, FAM76A,
## STX12, PPP1R8, RPA2, XKR8, EYA3, DNAJC8, AL353354.2, ATPIF1, RP5-1092A3.4,
## SESN2, MED18, PHACTR4, RCC1, TRNAU1AP, SNHG12, TAF12, RP11-442N24--B.1, RNU11,
## GMEB1, YTHDF2, EPB41, TMEM200B, SRSF4, MECR, MATN1, MATN1-AS1, LAPTM5, PUM1,
## SNRNP40, ZCCHC17, SERINC2, PEF1, PTP4A2, KHDRBS1, TMEM39B, KPNA6, TXLNA,
## CCDC28B, TMEM234, EIF3I, FAM167B, LCK, HDAC1, MARCKSL1, FAM229A, BSDC1, ZBTB8A,
## ZBTB8OS, RBBP4, SYNC, YARS, S100PBP, RNF19B, AK2, ADC, TRIM62, ZNF362, PHC2,
## SMIM12, DLGAP3, RP11-244H3.4, ZMYM6NB, ZMYM6, ZMYM1, SFPQ, ZMYM4, KIAA0319L,
## NCDN, RP4-728D4.2, TFAP2E, PSMB2, C1orf216, CLSPN, AGO4, AGO1, RP4-789D17.5,
## AGO3, ADPRHL2, TRAPPC3, MAP7D1, THRAP3, SH3D21, EVA1B, STK40, LSM10, OSCP1,
## MRPS15, LINC01137, ZC3H12A, MEAF6, SNIP1, GNL2, C1orf109, CDCA8, YRDC, C1orf122,
## MTF1, INPP5B, SF3A3, FHL3, UTP11L, RRAGC, RP5-864K19.4, MYCBP, AKIRIN1, NDUFS5,
## MACF1, KIAA0754, RP11-69E11.4, PABPC4, HPCAL4, PPIE, TRIT1, MFSD2A, CAP1,
## RLF, RP1-39G22.7, ZMPSTE24, COL9A2, SMAP2, ZFP69B, ZFP69, RP11-656D10.3, EXO5,
## ZNF684, RIMS3, NFYC-AS1, NFYC, CITED4, CTPS1, SLFNL1, SCMH1, HIVEP3, FOXJ3,
## PPCS, CCDC30, PPIH, LEPRE1, C1orf50, CCDC23, ERMAP, RP11-342M1.3, ZNF691,
## SLC2A1, SLC2A1-AS1, EBNA1BP2, WDR65, RP1-92O14.3, CDC20, ELOVL1, MED8, SZT2,
## HYI, KDM4A, KDM4A-AS1, IPO13, DPH2, CCDC24, DMAP1, ERI3, RNF220, TMEM53,
## C1orf228, KIF2C, BEST4, PLK3, BTBD19, PTCH2, EIF2B3, HECTD3, UROD, HPDL,
## MUTYH, TOE1, TESK2, CCDC163P, PRDX1, AKR1A1, NASP, GPBP1L1, TMEM69, IPP, MAST2,
## PIK3R3, POMGNT1, LRRC41, UQCRH, NSUN4, FAAH, MKNK1, MOB3C, ATPAF1, EFCAB14,
## CMPK1, RP11-511I2.2, FOXD2-AS1, FOXD2, SPATA6, BEND5, FAF1, CDKN2C, EPS15,
## OSBPL9, NRD1, TXNDC12, KTI12, BTF3L4, ZFYVE9, CC2D1B, ORC1, PRPF38A, ZCCHC11,
## GPX7, FAM159A, COA7, ZYG11B, ECHDC2, SCP2, PODN, SLC1A7, CPT2, C1orf123,
## RP5-1024G6.7, MAGOH, RP4-784A16.5, RP11-117D22.2, NDC1, YIPF1, HSPB11, LRRC42,
## TMEM59, TCEANC2, CYB5RL, MRPL37, SSBP3, ACOT11, TTC4, PARS2, TTC22, C1orf177,
## DHCR24, USP24, DAB1, OMA1, MYSM1, LINC01135, RP4-794H19.1, FGGY, HOOK1,
## CYP2J2, NFIA, TM2D1, INADL, L1TD1, USP1, DOCK7, ATG4C, ALG6, ITGB3BP, EFCAB7,
## DLEU2L, PGM1, RAVER2, JAK1, AK4, LEPR, LEPROT, PDE4B, MIER1, SLC35D1, IL23R,
## IL12RB2, SERBP1, GADD45A, WLS, LRRC7, LRRC40, SRSF11, ANKRD13C, HHLA3, CTH,
## ZRANB2, LRRIQ3, FPGT, CRYZ, TYW3, ACADM, RABGGTB, ST6GALNAC3, PIGK, AK5, ZZZ3,
## USP33, FAM73A, FUBP1, DNAJB4, RP11-386I14.4, IFI44L, IFI44, RP5-887A10.1,
## RP11-475O6.1, RP11-486G15.2, PRKACB, RPF1, CTBS, SSX2IP, MCOLN2, MCOLN3,
## SYDE2, C1orf52, BCL10, RP11-131L23.1, ZNHIT6, ODF2L, RP4-612B15.3, SH3GLB1,
## SEP15, HS2ST1, LMO4, PKN2, GTF2B, CCBL2, RBMXL1, GBP3, GBP1, GBP2, GBP4, GBP5,
## LRRC8B, RP5-1007M22.2, LRRC8C, RP5-943J3.2, LRRC8D, ZNF326, ZNF644, CDC7,
## TGFBR3, BTBD8, KIAA1107, GLMN, RPAP2, GFI1, EVI5, FAM69A, MTF2, TMED5, CCDC18,
## DR1, FNBP1L, RP4-561L24.3, DNTTIP2, GCLM, ARHGAP29, ABCD3, CNN3, ALG14, RWDD3,
## PTBP2, DPYD, AGL, RP5-884G6.2, SLC35A3, HIAT1, SASS6, TRMT13, DBT, RTCA, CDC14A,
## EXTL2, RP4-549L20.3, SLC30A7, DPH5, AC093157.1, RP11-421L21.2, RP11-421L21.3,
## RP4-575N6.4, S1PR1, RNPC3, AMY2B, PRMT6, VAV3, VAV3-AS1, RP11-356N1.2,
## SLC25A24, RP11-483I13.5, FAM102B, HENMT1, PRPF38B, STXBP3, GPSM2, CLCC1, WDR47,
## TAF13, RP5-1065J22.8, TMEM167B, KIAA1324, SARS, CELSR2, PSRC1, SORT1, PSMA5,
## ATXN7L2, CYB561D1, AMIGO1, GPR61, GNAI3, GSTM4, GSTM2, GSTM1, GSTM3, CSF1,
## AHCYL1, STRIP1, RP4-773N10.4, KCNC4, RBM15, SLC16A4, RP5-1074L1.4, LAMTOR5-
## AS1, LAMTOR5, RP11-284N8.3, KCNA3, RP11-96K19.2, LRIF1, RP11-96K19.5, DRAM2,
## CEPT1, RP5-1180E21.5, DENND2D, CHI3L2, PIFO, OVGP1, WDR77, ATP5F1, ADORA3,
## RAP1A, FAM212B, DDX20, CTTNBP2NL, WNT2B, ST7L, CAPZA1, MOV10, RP11-426L16.3,
## RHOC, PPM1J, SLC16A1, SLC16A1-AS1, RP11-389O22.1, LRIG2, MAGI3, PHTF1, RSBN1,
## PTPN22, AP4B1-AS1, BCL2L15, AP4B1, DCLRE1B, RP5-1073O3.7, HIPK1, TRIM33, BCAS2,
## DENND2C, NRAS, CSDE1, SIKE1, TSPAN2, VANGL1, SLC22A15, ATP1A1, AL136376.1, CD58,
## CD2, CD101, TTF2, MAN1A2, FAM46C, GDAP2, WDR3, WARS2, RP11-418J17.1, PHGDH,
## REG4, NOTCH2, RP11-114O18.1, FAM72B, RP11-343N15.5, RP11-344P13.6, RP11-423O2.5,
## RP11-782C8.1, RP6-206I17.1, RP6-206I17.2, LINC00623, AL592284.1, RP11-640M9.1,
## NBPF9, PDE4DIP, AL590452.1, RP11-458D21.6, NOTCH2NL, TXNIP, POLR3GL, ANKRD34A,
## RP11-315I20.1, LIX1L, RBM8A, PEX11B, ITGA10, ANKRD35, PIAS3, NUDT17, POLR3C,
## RNF115, GPR89A, NBPF12, PRKAB2, RP11-337C18.8, FMO5, CHD1L, BCL9, ACP6,
## NBPF14, RP11-89F3.2, NBPF20, NBPF15, RP11-666A1.5, RP11-14N7.2, RP11-403I13.4,
## RP11-403I13.8, RP11-277L2.3, RP11-353N4.4, HIST2H2BF, RP11-196G18.24, HIST2H2AC,
## HIST2H2AB, BOLA1, SV2A, SF3B4, OTUD7B, VPS45, ANP32E, APH1A, C1orf54, C1orf51,
## MRPS21, PRPF3, RPRD2, TARS2, ADAMTSL4, ENSA, GOLPH3L, CTSK, ARNT, SETDB1,
## CERS2, PRUNE, C1orf56, CDC42SE1, MLLT11, GABPB2, TNFAIP8L2, SCNM1, VPS72,
## PIP5K1A, PSMD4, RP11-126K1.2, ZNF687, PI4KB, RFX5, RP11-126K1.6, PSMB4, POGZ,
## TUFT1, SNX27, MRPL9, OAZ3, RP11-98D18.3, TDRKH, RP11-98D18.9, RORC, C2CD4D,
## THEM4, S100A5, S100A13, CHTOP, SNAPIN, ILF2, INTS3, SLC27A3, GATAD2B, DENND4B,
## CRTC2, SLC39A1, CREB3L4, JTB, RP11-422P24.11, RAB13, TPM3, C1orf43, UBAP2L,
## HAX1, AQP10, ATP8B2, RP11-350G8.5, IL6R, UBE2Q1, ADAR, PMVK, RP11-307C12.13,
## PBXIP1, PYGO2, RP11-307C12.12, SHC1, CKS1B, FLAD1, ZBTB7B, ADAM15, EFNA4, EFNA3,
## SLC50A1, DPM3, KRTCAP2, TRIM46, THBS3, MTX1, GBA, FAM189B, SCAMP3, CLK2, FDPS,
## RUSC1-AS1, RUSC1, ASH1L, MSTO1, YY1AP1, DAP3, GON4L, SYT11, RIT1, KIAA0907,
## ARHGEF2, RP11-336K24.12, SSR2, UBQLN4, RAB25, LMNA, SLC25A44, PMF1, BGLAP,
## SMG5, TMEM79, C1orf85, CCT3, C1orf61, MEF2D, TTC24, APOA1BP, GPATCH4, ISG20L2,
## RRNAD1, MRPL24, HDGF, PRCC, ARHGEF11, ETV3, FCRL5, FCRL3, CD1A, CD1B, CD1E,
## PYHIN1, IFI16, AIM2, FCER1A, DUSP23, SLAMF8, C1orf204, VSIG8, TAGLN2, PIGM,
## IGSF8, RP11-536C5.7, PEA15, DCAF8, PEX19, COPA, NCSTN, SLAMF6, CD84, SLAMF1,
## RP11-404F10.2, CD48, SLAMF7, LY9, CD244, ITLN1, F11R, TSTD1, USF1, ARHGAP30,
## KLHDC9, PFDN2, NI
pbmc_dbf <- RunUMAP(pbmc_dbf, dims = 1:10)
## Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
## To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
## This message will be shown once per session
pbmc_dbf <- FindNeighbors(pbmc_dbf, reduction = "pca", dims = 1:20)
pbmc_dbf <- FindClusters(pbmc_dbf)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 2638
## Number of edges: 112494
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.8376
## Number of communities: 9
## Elapsed time: 0 seconds
dim_plot_dbf <- DimPlot(pbmc_dbf, reduction = "umap")
dim_plot_dbf

Transfer infered cell populations to a ClusterSet object

The inferred populations can now be transferred into the ClusterSet object using the load_seurat() method and represented using the plot_clust function.

dbf_seurat <- load_seurat(dbf, 
                          seurat_obj=pbmc_dbf,
                          dimplot_obj=dim_plot_dbf)

Visualizing gene clusters

The plot_clust() method can be used to display the cluster of co-regulated genes. Here we only display the average expression profile of each cluster. Note that to improve readability data are floored and ceiled (si corresponding arguments).

g_profiles <- plot_clust(dbf_seurat,
                       average_only = TRUE,
                       floor=-1, 
                       ceil=1)
## |--  getting matrix 
## |--  Median-centering rows. 
## |--  Ceiling matrix. 
## |--  Flooring matrix. 
## |--  Melting matrix. 
## |--  Storing cell types. 
## |--  Preparing diagram. 
## |--  Adding cell populations to the diagram. 
## |--  Adding average profile. 
## |--  Faceting. 
## |--  Theming. 
## |--  Adding facets.
g_profiles

Both the dimplot and gene profiles can be presented in the same diagram using the command below

g_profiles_no_legend <- g_profiles + theme(legend.position = "none")
g_profiles_no_legend + dim_plot_dbf

Alternatively the cluster obtained can be represented using a heatmap (thanks to the type argument that can be set to ‘tile’):

g_heatmap <- plot_clust(dbf_seurat, 
                         average_only = TRUE,
                         type="tile",
                         floor=-1, 
                         ceil=1)
## |--  getting matrix 
## |--  Median-centering rows. 
## |--  Ceiling matrix. 
## |--  Flooring matrix. 
## |--  Melting matrix. 
## |--  Storing cell types. 
## |--  Preparing diagram (tile). 
## |--  Preparing color palette. 
## |--  Theming. 
## |--  Adding facets.
g_heatmap

Assessing the expression level of clusters in cell populations

Checking the level of expression of each cluster in the cell population can be checked using the AddModuleScore from the Seurat library which calculates ‘the average expression levels of each program (cluster) on single cell level, subtracted by the aggregated expression of control feature sets.’

for(i in 1:max(dbf_seurat@cluster)){
  tmp_features <- list(rownames(dbf_seurat@data)[dbf_seurat@cluster == i ])
pbmc_dbf <- AddModuleScore(object = pbmc_dbf, 
                           features = tmp_features, 
                           name = paste("cluster_", i, "_", sep=""), ctrl = 5)
}

module_list <- vector()
for(i in 1:max(dbf_seurat@cluster)){
  module_list[i] <- paste("cluster_", i, "_1", sep="")
}

FeaturePlot(object = pbmc_dbf, 
            features = module_list)

Cluster 1 to 4 and 9 clearly highlight some coordinated gene regulations that occur specifically in particular cell populations. In constrast gene clusters 5 to 8 seem to have very close average profile (see heatmap above). However, closests inspection shows they have expression restricted to different cell populations. Indeed, the cluster 8 contains several genes related to cell cycle highlight that some some cells are apparently in active division or at least engaged in a cell division process. Regarding, gene cluster 5, 6 and 7 it is hard to tell whether they would have to be merged into a single one. However, the FeaturePlot show below tend to indicate that they could represent some diversity inside a single cell population (platelets as shown later).

plist <- FeaturePlot(pbmc_dbf, 
                     features=c("cluster_5_1", "cluster_6_1", "cluster_7_1"))
plist & xlim(c(-8.7, -8.1)) & ylim(c(4.4, 5.1))
## Warning: Removed 2638 rows containing missing values (geom_point).

## Warning: Removed 2638 rows containing missing values (geom_point).

## Warning: Removed 2638 rows containing missing values (geom_point).

Comparing DBFMCL gene filtering with variance stabilizing transformation

We can compare the clustering power of the gene selected using DBFMCL with those obtained using the original method from Seurat (variance stabilizing transformation, vst). As shown below, on this PBMC dataset, DBFMCL selected genes (left) tend to produce a more resolutive map of cell populations.

# Create a dimplot using original (vst) gene filtering method.
pbmc_orig <- FindVariableFeatures(pbmc_norm, selection.method = "vst", nfeatures = 2000)
pbmc_orig <- ScaleData(pbmc_orig)
pbmc_orig <- RunPCA(pbmc_orig, features = rownames(pbmc_dbf))
## Warning in PrepDR(object = object, features = features, verbose = verbose):
## The following 11714 features requested have not been scaled (running reduction
## without them): AL627309.1, AP006222.2, RP11-206L10.2, RP11-206L10.9, LINC00115,
## NOC2L, KLHL17, PLEKHN1, RP11-54O7.17, HES4, RP11-54O7.11, AGRN, C1orf159,
## TNFRSF18, TNFRSF4, SDF4, B3GALT6, FAM132A, UBE2J2, ACAP3, PUSL1, GLTPD1,
## DVL1, MXRA8, AURKAIP1, CCNL2, RP4-758J18.2, ATAD3B, ATAD3A, SSU72, AL645728.1,
## C1orf233, RP11-345P4.9, MIB2, MMP23B, CDK11B, SLC35E2B, CDK11A, SLC35E2, NADK,
## GNB1, RP1-140A9.1, TMEM52, PRKCZ, RP5-892K4.1, AL590822.2, SKI, PEX10, PLCH2,
## PANK4, RP3-395M20.12, TNFRSF14, FAM213B, MMEL1, TTC34, MEGF6, TPRG1L, WRAP73,
## TP73-AS1, SMIM1, CEP104, DFFB, C1orf174, NPHP4, KCNAB2, RPL22, RNF207, ICMT,
## ACOT7, RP1-202O8.3, ESPN, PLEKHG5, NOL9, ZBTB48, KLHL21, PHF13, THAP3, DNAJC11,
## RP11-312B8.1, CAMTA1, VAMP3, PER3, UTS2, PARK7, SLC45A1, RERE, RP5-1115A15.1,
## ENO1, ENO1-AS1, CA6, SLC2A5, GPR157, H6PD, SPSB1, SLC25A33, TMEM201, PIK3CD,
## C1orf200, RP11-558F24.4, CLSTN1, LZIC, NMNAT1, UBE4B, KIF1B, PGD, APITD1, DFFA,
## PEX14, CASZ1, TARDBP, RP4-635E18.8, EXOSC10, MTOR, FBXO2, FBXO44, FBXO6, MAD2L2,
## AGTRAP, MTHFR, CLCN6, NPPA-AS1, KIAA2013, PLOD1, MFN2, MIIP, TNFRSF8, TNFRSF1B,
## VPS13D, DHRS3, TMEM51, CASP9, DNAJC16, AGMAT, PLEKHM2, FBLIM1, RP11-169K16.9,
## ZBTB17, ARHGEF19, RSG1, FBXO42, SZRD1, SPATA21, NECAP2, RP4-798A10.2,
## RP4-798A10.7, RP4-798A10.4, NBPF1, CROCCP2, CROCC, RP11-108M9.4, RP11-108M9.6,
## ATP13A2, PADI2, PADI4, RCC2, ARHGEF10L, ALDH4A1, IFFO2, UBR4, RP1-43E13.2, EMC1,
## MRTO4, AKR7A2, PQLC2, CAPZB, MINOS1-NBL1, MINOS1, NBL1, TMCO4, OTUD3, UBXN10-
## AS1, UBXN10, MUL1, PINK1-AS, DDOST, RP5-930J4.4, EIF4G3, ECE1, RP3-329E20.2,
## NBPF3, ALPL, USP48, HSPG2, RP1-224A6.3, LINC00339, CDC42, ZBTB40, EPHB2, KDM1A,
## LUZP1, RP5-1057J7.6, HNRNPR, ZNF436, C1orf213, TCEA3, E2F2, ID3, RPL11, TCEB3,
## RP5-886K2.3, LYPLA2, GALE, FUCA1, CNR2, PNRC2, SRSF10, IFNLR1, STPG1, NIPAL3,
## RCAN3, RP4-594I10.3, SRRM1, CLIC4, RUNX3, SYF2, RP3-465N24.6, TMEM57, MAN1C1,
## RP1-187B23.1, SEPN1, RP1-317E23.3, MTFR1L, AL020996.1, PAQR7, PAFAH2, CNKSR1,
## CEP85, UBXN11, CD52, AIM1L, ZNF683, DHDDS, HMGN2, RPS6KA1, ARID1A, PIGV,
## ZDHHC18, GPN2, GPATCH3, C1orf172, TRNP1, SLC9A1, WDTC1, SYTL1, MAP3K6, WASF2,
## RP1-159A19.4, AHDC1, FAM76A, STX12, THEMIS2, RPA2, XKR8, EYA3, AL353354.2,
## ATPIF1, RP5-1092A3.4, SESN2, MED18, RCC1, TRNAU1AP, RP11-442N24--B.1, RNU11,
## GMEB1, EPB41, TMEM200B, SRSF4, MECR, MATN1, MATN1-AS1, LAPTM5, SNRNP40,
## ZCCHC17, SERINC2, PEF1, PTP4A2, KHDRBS1, TMEM39B, KPNA6, TXLNA, CCDC28B, EIF3I,
## FAM167B, LCK, MARCKSL1, FAM229A, ZBTB8A, RBBP4, SYNC, YARS, S100PBP, RNF19B,
## ADC, TRIM62, ZNF362, PHC2, DLGAP3, RP11-244H3.4, ZMYM6NB, ZMYM6, ZMYM1, SFPQ,
## ZMYM4, KIAA0319L, NCDN, RP4-728D4.2, TFAP2E, PSMB2, C1orf216, CLSPN, AGO1,
## RP4-789D17.5, AGO3, ADPRHL2, MAP7D1, THRAP3, SH3D21, STK40, LSM10, OSCP1,
## MRPS15, CSF3R, LINC01137, ZC3H12A, MEAF6, SNIP1, GNL2, C1orf109, CDCA8, YRDC,
## C1orf122, MTF1, INPP5B, SF3A3, FHL3, UTP11L, RP5-864K19.4, MYCBP, AKIRIN1,
## NDUFS5, MACF1, KIAA0754, RP11-69E11.4, PABPC4, HPCAL4, MFSD2A, CAP1, RLF,
## RP1-39G22.7, ZMPSTE24, COL9A2, ZFP69B, ZFP69, RP11-656D10.3, EXO5, ZNF684,
## RIMS3, NFYC-AS1, CTPS1, SLFNL1, SCMH1, HIVEP3, FOXJ3, PPCS, CCDC30, PPIH, YBX1,
## LEPRE1, CCDC23, ERMAP, RP11-342M1.3, ZNF691, SLC2A1, SLC2A1-AS1, EBNA1BP2,
## WDR65, RP1-92O14.3, CDC20, ELOVL1, MED8, SZT2, HYI, KDM4A, KDM4A-AS1, ST3GAL3,
## IPO13, DPH2, CCDC24, RNF220, TMEM53, C1orf228, KIF2C, RPS8, BEST4, PLK3, BTBD19,
## PTCH2, EIF2B3, HECTD3, UROD, HPDL, MUTYH, TOE1, TESK2, CCDC163P, AKR1A1, NASP,
## TMEM69, IPP, MAST2, PIK3R3, POMGNT1, LRRC41, UQCRH, NSUN4, MOB3C, ATPAF1, CMPK1,
## RP11-511I2.2, FOXD2-AS1, FOXD2, SPATA6, BEND5, FAF1, CDKN2C, RNF11, EPS15,
## OSBPL9, NRD1, TXNDC12, KTI12, BTF3L4, ZFYVE9, CC2D1B, ORC1, PRPF38A, ZCCHC11,
## GPX7, FAM159A, COA7, ZYG11B, ECHDC2, PODN, SLC1A7, CPT2, RP5-1024G6.7, MAGOH,
## RP4-784A16.5, RP11-117D22.2, NDC1, YIPF1, LRRC42, TMEM59, TCEANC2, CYB5RL,
## MRPL37, ACOT11, TTC4, TTC22, C1orf177, DHCR24, USP24, DAB1, OMA1, MYSM1, JUN,
## LINC01135, RP4-794H19.1, FGGY, HOOK1, CYP2J2, NFIA, TM2D1, INADL, L1TD1, USP1,
## DOCK7, ALG6, ITGB3BP, EFCAB7, DLEU2L, RAVER2, AK4, LEPR, PDE4B, MIER1, SLC35D1,
## IL23R, IL12RB2, SERBP1, GADD45A, LRRC7, LRRC40, SRSF11, ANKRD13C, HHLA3, CTH,
## ZRANB2, LRRIQ3, FPGT, CRYZ, TYW3, RABGGTB, ST6GALNAC3, PIGK, AK5, ZZZ3, FAM73A,
## FUBP1, DNAJB4, RP11-386I14.4, IFI44L, RP11-475O6.1, RP11-486G15.2, RPF1, GNG5,
## CTBS, MCOLN2, SYDE2, C1orf52, BCL10, RP11-131L23.1, ZNHIT6, ODF2L, RP4-612B15.3,
## SEP15, HS2ST1, LMO4, CCBL2, RBMXL1, GBP3, GBP2, GBP5, LRRC8B, RP5-1007M22.2,
## RP5-943J3.2, LRRC8D, ZNF326, ZNF644, CDC7, TGFBR3, BTBD8, KIAA1107, GLMN, RPAP2,
## GFI1, EVI5, RPL5, FAM69A, MTF2, CCDC18, DR1, FNBP1L, DNTTIP2, GCLM, ARHGAP29,
## ABCD3, CNN3, ALG14, RWDD3, PTBP2, DPYD, AGL, RP5-884G6.2, SLC35A3, HIAT1,
## SASS6, TRMT13, DBT, RTCA, CDC14A, EXTL2, RP4-549L20.3, SLC30A7, AC093157.1,
## RP11-421L21.2, RP4-575N6.4, S1PR1, RNPC3, AMY2B, PRMT6, VAV3, VAV3-AS1,
## RP11-356N1.2, SLC25A24, RP11-483I13.5, FAM102B, PRPF38B, STXBP3, GPSM2, CLCC1,
## WDR47, TAF13, RP5-1065J22.8, TMEM167B, KIAA1324, CELSR2, PSRC1, SORT1, PSMA5,
## ATXN7L2, CYB561D1, GPR61, GNAI3, AMPD2, GSTM4, GSTM2, GSTM1, GSTM3, CSF1,
## AHCYL1, STRIP1, RP4-773N10.4, KCNC4, RBM15, SLC16A4, RP5-1074L1.4, LAMTOR5-AS1,
## RP11-284N8.3, KCNA3, CD53, RP11-96K19.2, LRIF1, RP11-96K19.5, RP5-1180E21.5,
## DENND2D, PIFO, OVGP1, WDR77, ATP5F1, ADORA3, RAP1A, DDX20, CTTNBP2NL, WNT2B,
## CAPZA1, MOV10, RP11-426L16.3, PPM1J, SLC16A1, SLC16A1-AS1, RP11-389O22.1, LRIG2,
## MAGI3, PHTF1, RSBN1, PTPN22, AP4B1-AS1, BCL2L15, AP4B1, DCLRE1B, HIPK1, TRIM33,
## BCAS2, DENND2C, NRAS, CSDE1, SIKE1, TSPAN2, VANGL1, SLC22A15, AL136376.1, CD58,
## CD101, TTF2, MAN1A2, FAM46C, GDAP2, WDR3, RP11-418J17.1, PHGDH, REG4, NOTCH2,
## RP11-114O18.1, FAM72B, FCGR1B, RP11-343N15.5, RP11-344P13.6, RP11-423O2.5,
## RP11-782C8.1, RP6-206I17.1, RP6-206I17.2, LINC00623, AL592284.1, RP11-640M9.1,
## NBPF9, PDE4DIP, AL590452.1, RP11-458D21.6, NOTCH2NL, NBPF10, TXNIP, POLR3GL,
## ANKRD34A, RP11-315I20.1, LIX1L, RBM8A, PEX11B, ITGA10, ANKRD35, PIAS3, NUDT17,
## POLR3C, RNF115, GPR89A, NBPF12, PRKAB2, RP11-337C18.8, FMO5, CHD1L, BCL9, ACP6,
## NBPF14, RP11-89F3.2, NBPF20, NBPF15, RP11-666A1.5, RP11-14N7.2, RP11-403I13.4,
## RP11-403I13.8, RP11-277L2.3, RP11-353N4.4, HIST2H2BF, RP11-196G18.24, HIST2H2BE,
## HIST2H2AC, HIST2H2AB, SV2A, SF3B4, MTMR11, OTUD7B, VPS45, PLEKHO1, ANP32E,
## APH1A, MRPS21, PRPF3, RPRD2, TARS2, ADAMTSL4, MCL1, ENSA, GOLPH3L, CTSK,
## ARNT, SETDB1, CERS2, FAM63A, C1orf56, CDC42SE1, GABPB2, TNFAIP8L2, SCNM1,
## PIP5K1A, PSMD4, RP11-126K1.2, ZNF687, RFX5, RP11-126K1.6, PSMB4, POGZ, TUFT1,
## SNX27, OAZ3, RP11-98D18.3, TDRKH, RP11-98D18.9, RORC, C2CD4D, S100A5, S100A13,
## CHTOP, ILF2, INTS3, SLC27A3, GATAD2B, DENND4B, CREB3L4, JTB, RP11-422P24.11,
## RAB13, RPS27, TPM3, C1orf43, UBAP2L, AQP10, ATP8B2, RP11-350G8.5, IL6R, ADAR,
## RP11-307C12.13, PBXIP1, PYGO2, SHC1, FLAD1, ZBTB7B, ADAM15, EFNA4, EFNA3,
## SLC50A1, DPM3, KRTCAP2, TRIM46, THBS3, MTX1, GBA, FAM189B, SCAMP3, CLK2,
## FDPS, RUSC1-AS1, RUSC1, ASH1L, MSTO1, YY1AP1, DAP3, GON4L, SYT11, KIAA0907,
## RP11-336K24.12, SSR2, UBQLN4, LAMTOR2, RAB25, LMNA, SEMA4A, SLC25A44, BGLAP,
## SMG5, TMEM79, C1orf85, CCT3, C1orf61, TTC24, APOA1BP, ISG20L2, RRNAD1,
## MRPL24, PRCC, SH2D2A, ARHGEF11, ETV3, FCRL5, FCRL3, FCRL2, FCRL1, CD1D, CD1A,
## CD1B, PYHIN1, IFI16, FCRL6, SLAMF8, C1orf204, VSIG8, TAGLN2, PIGM, IGSF8,
## RP11-536C5.7, PEA15, COPA, NCSTN, SLAMF6, SLAMF1, RP11-404F10.2, CD48, SLAMF7,
## LY9, CD244, ITLN1, F11R, TSTD1, USF1, ARHGAP30, KLHDC9, UFC1, USP21, PPOX,
## B4GALT3, NDUFS2, TOMM40L, MPZ, SDHC, HSPA6, FCRLB, DUSP12, ATF6, SH2D1B,
## UHMK1, RP11-359K18.3, UAP1, HSD17B7, RP11-267N12.3, NUF2, PBX1, MGST3, ALDH9A1,
## RP11-466F5.8, UCK2, POGK, TADA1, GPA33, RP11-277B15.3, POU2F1, RP11-104L21.3,
## CREG1, RP3-455J7.4, RCSD1, MPZL1, DCAF6, TIPRL, SFT2D2, TBX19, ATP1B1, NME7,
## SLC19A2, F5, SELP, C1orf112, METTL18, SCYL3, KIFAP3, GORAB, FMO4, PRRC2C,
## VAMP4, DNM3, PIGC, SUCO, FASLG, RP11-296O14.3, PRDX6, KLHL20, CENPL, DARS2,
## ZBTB37, RC3H1, RP11-160H22.5, RABGAP1L, CACYBP, MRPS14, RP11-318C24.2, RFWD2,
## RP5-1098D14.1, RALGPS2, FAM20B, TOR3A, ABL2, SOAT1, TOR1AIP2, RP11-533E19.7,
## TOR1AIP1, RP11-533E19.5, CEP350, RP5-1180C10.2, ACBD6, XPR1, RP11-46A10.5, STX6,
## MR1, IER5, RP11-309G3.3, GLUL, RNASEL, NPL, LAMC1, SMG7, RGL1, COLGA
pbmc_orig <- RunUMAP(pbmc_orig, dims = 1:10)
pbmc_orig <- FindNeighbors(pbmc_orig, reduction = "pca", dims = 1:20)
pbmc_orig <- FindClusters(pbmc_orig)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 2638
## Number of edges: 120549
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.8198
## Number of communities: 9
## Elapsed time: 0 seconds
dim_plot_orig <- DimPlot(pbmc_orig, reduction = "umap")

# Compare reduction map obtained with vst and DBFMCL filtering method.
dim_plot_orig + dim_plot_dbf

Performing alternative cell ordering

It is easy to define alternative ordering for the columns/cells. For instance one may try the hierarchical clustering to try to put emphasis on some gene clusters.

library(amap)
##  hclust on samples
hier_clustering <- hcluster(log2(t(dbf_seurat@data) +1), method="pearson", link="average", nbproc = 10)
dbf_hc <- dbf_seurat
dbf_hc@cell_order <- colnames(dbf_hc@data)[hier_clustering$order]

g_profiles_hc <- plot_clust(dbf_hc,
       average_only = TRUE,
       floor=-1, 
       type="tile",
       ceil=1)
## |--  getting matrix 
## |--  Median-centering rows. 
## |--  Ceiling matrix. 
## |--  Flooring matrix. 
## |--  Melting matrix. 
## |--  Storing cell types. 
## |--  Preparing diagram (tile). 
## |--  Preparing color palette. 
## |--  Theming. 
## |--  Adding facets.
g_profiles_hc

R session

sessionInfo()
## R version 4.1.1 (2021-08-10)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Catalina 10.15.7
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] amap_0.8-18        ggplot2_3.3.5      SeuratObject_4.0.2 Seurat_4.0.4      
## [5] scigenex_1.0.1     testthat_3.0.4    
## 
## loaded via a namespace (and not attached):
##   [1] plyr_1.8.6            igraph_1.2.6          lazyeval_0.2.2       
##   [4] splines_4.1.1         listenv_0.8.0         scattermore_0.7      
##   [7] usethis_2.0.1         digest_0.6.27         htmltools_0.5.2      
##  [10] fansi_0.5.0           magrittr_2.0.1        memoise_2.0.0        
##  [13] tensor_1.5            cluster_2.1.2         ROCR_1.0-11          
##  [16] remotes_2.4.0         globals_0.14.0        matrixStats_0.60.1   
##  [19] spatstat.sparse_2.0-0 prettyunits_1.1.1     colorspace_2.0-2     
##  [22] ggrepel_0.9.1         xfun_0.25             dplyr_1.0.7          
##  [25] callr_3.7.0           crayon_1.4.1          jsonlite_1.7.2       
##  [28] spatstat.data_2.1-0   survival_3.2-11       zoo_1.8-9            
##  [31] glue_1.4.2            polyclip_1.10-0       gtable_0.3.0         
##  [34] leiden_0.3.9          pkgbuild_1.2.0        future.apply_1.8.1   
##  [37] abind_1.4-5           scales_1.1.1          miniUI_0.1.1.1       
##  [40] Rcpp_1.0.7            viridisLite_0.4.0     xtable_1.8-4         
##  [43] reticulate_1.20       spatstat.core_2.3-0   htmlwidgets_1.5.3    
##  [46] httr_1.4.2            RColorBrewer_1.1-2    ellipsis_0.3.2       
##  [49] ica_1.0-2             pkgconfig_2.0.3       farver_2.1.0         
##  [52] sass_0.4.0            uwot_0.1.10           deldir_0.2-10        
##  [55] utf8_1.2.2            tidyselect_1.1.1      labeling_0.4.2       
##  [58] rlang_0.4.11          reshape2_1.4.4        later_1.3.0          
##  [61] munsell_0.5.0         tools_4.1.1           cachem_1.0.6         
##  [64] cli_3.0.1             generics_0.1.0        devtools_2.4.2       
##  [67] ggridges_0.5.3        evaluate_0.14         stringr_1.4.0        
##  [70] fastmap_1.1.0         yaml_2.2.1            goftest_1.2-2        
##  [73] processx_3.5.2        knitr_1.33            fs_1.5.0             
##  [76] fitdistrplus_1.1-5    purrr_0.3.4           RANN_2.6.1           
##  [79] pbapply_1.4-3         future_1.22.1         nlme_3.1-152         
##  [82] mime_0.11             compiler_4.1.1        rstudioapi_0.13      
##  [85] plotly_4.9.4.1        curl_4.3.2            png_0.1-7            
##  [88] spatstat.utils_2.2-0  tibble_3.1.4          bslib_0.2.5.1        
##  [91] stringi_1.7.4         highr_0.9             ps_1.6.0             
##  [94] desc_1.3.0            RSpectra_0.16-0       lattice_0.20-44      
##  [97] Matrix_1.3-4          vctrs_0.3.8           pillar_1.6.2         
## [100] lifecycle_1.0.0       spatstat.geom_2.2-2   lmtest_0.9-38        
## [103] jquerylib_0.1.4       RcppAnnoy_0.0.19      data.table_1.14.0    
## [106] cowplot_1.1.1         irlba_2.3.3           httpuv_1.6.2         
## [109] patchwork_1.1.1       R6_2.5.1              promises_1.2.0.1     
## [112] KernSmooth_2.23-20    gridExtra_2.3         parallelly_1.27.0    
## [115] sessioninfo_1.1.1     codetools_0.2-18      MASS_7.3-54          
## [118] pkgload_1.2.1         rprojroot_2.0.2       withr_2.4.2          
## [121] sctransform_0.3.2     mgcv_1.8-36           parallel_4.1.1       
## [124] grid_4.1.1            rpart_4.1-15          tidyr_1.1.3          
## [127] rmarkdown_2.10        Rtsne_0.15            shiny_1.6.0